/*
 * CntrPersistencia.java
 *
 * Created on February 8, 2006, 6:40 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package controladoras.persistencia;

import comandos.CmdBD;
import erros.ErroPersistencia;
import interfaces.IPersistencia;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;


/**
 * Classe que implementa a controladora de persistencia.
 * @author Thiago Stuckert
 */
public abstract class CntrPersistencia implements IPersistencia {


    /**
     * Método Fábrica Abstrato.
     * @throws ErroPersistencia lança exceção caso não
     * consiga criar o driver.
     */
    protected abstract void criarDriver() throws ErroPersistencia;

    /**
     * Construtor da controladora de persistencia.
     * @throws ErroPersistencia erro ao tentar carreagar o driver.
     */
    public CntrPersistencia() throws ErroPersistencia {
        criarDriver();
    }



    /**
     * Metodo que executa um comando SQL no banco de dadso.
     * @param comando Comando SQL a ser executado no banco de dados.
     * @throws erros.ErroPersistencia Exceção lançada caso ocorra algum erro
     * relatiovo ao banco de dados.
     */
    @Override
    public Object executar(final CmdBD comando) throws ErroPersistencia {
        CntrConexao cntr = CntrConexao.instanciar();
        Connection con = cntr.getConexao();
        return comando.executar(con);
    }

    /**
     * Método fecha conexão com o banco de dados.
     * @throws ErroPersistencia
     */
    public void shutdown() throws ErroPersistencia {
        try {
            CntrConexao cntr = CntrConexao.instanciar();
            Connection con = cntr.getConexao();
            Statement st = con.createStatement();
            st.execute("SHUTDOWN");
            con.close();
        } catch (SQLException exp) {
            throw new ErroPersistencia("Erro ao tentar fechar conexao"
                    + " com o banco");
        }
    }

    /**
     * Método executado ao fim da ação com o banco.
     * @throws Throwable Pode lançar exceção.
     */
    @Override
    protected void finalize() throws Throwable {
        shutdown();
    }

}

